<?php
//但是简单工厂有问题。1.会造成很多子类。2.会有很多重复代码。所以工厂模式和抽象工厂模式要一起使用
//如果上一章横向增长是没问题的，但是纵向增长呢（之前是预约编码，还有代办编码，联系人编码）？横向增加两个的做法

//第一个版本
abstract class ApptEncoder{
    abstract function encode();
}

class BloggsApptEncoder extends ApptEncoder{
    public function encode()
    {
        return '把数据编码成bloggs格式';
    }
}

class MegaApptEncoder extends ApptEncoder{
    public function encode()
    {
        return '把数据编码成Mega格式';
    }
}


abstract class TtdEncoder{
    abstract function encode();
}

class BloggsTtdEncoder extends TtdEncoder{
    public function encode()
    {
        return '把数据编码成bloggs格式';
    }
}

class MegaTtdEncoder extends TtdEncoder{
    public function encode()
    {
        return '把数据编码成Mega格式';
    }
}


abstract class ContactEncoder{
    abstract function encode();
}

class BloggsContactEncoder extends ContactEncoder{
    public function encode()
    {
        return '把数据编码成bloggs格式';
    }
}

class MegaContactEncoder extends ContactEncoder{
    public function encode()
    {
        return '把数据编码成Mega格式';
    }
}



/*abstract class CommsManger{
    abstract function getHeaderText();
    abstract function getApptEncoder();
    abstract function getTtdEncoder();
    abstract function getContactEncoder();
    abstract function getFootText();
}

class BloggsCommsManger extends CommsManger{
    public function getApptEncoder()
    {
        return new BloggsApptEncoder();
    }

    public function getTtdEncoder()
    {
        return new BloggsTtdEncoder();
    }
    public function getContactEncoder()
    {
        return new BloggsContactEncoder();
    }

    public function getFootText()
    {
        return 'bloggs 尾';
    }
    public function getHeaderText()
    {
        return 'bloggs 头';
    }
}

class MegaCommsManger extends CommsManger{
    public function getApptEncoder()
    {
        return new MegaApptEncoder();
    }

    public function getTtdEncoder()
    {
        return new MegaTtdEncoder();
    }
    public function getContactEncoder()
    {
        return new MegaContactEncoder();
    }

    public function getFootText()
    {
        return 'mega 尾';
    }
    public function getHeaderText()
    {
        return 'mega 头';
    }
}*/

//第一个版本如果纵向增加，不得不去修改抽象方法，这样就会改变所有的类！
//第二个版本在子类里面添加 （此种改法还是存在要定义一种类型，每增加一个产品就会增加一个子类）

abstract class CommsManger{
    const APPT = 1;
    const TTD = 2;
    const CONTACT =3;
    abstract function getHeaderText();
    abstract function make($flag_int);
    abstract function getFootText();
}

class BloggsCommsManger extends CommsManger{
    public function make($flag_int)
    {
        switch($flag_int){
            case self::APPT:
                return new BloggsApptEncoder();
            case self::CONTACT:
                return new BloggsContactEncoder();
            case self::CONTACT:
                return new BloggsContactEncoder();
        }
    }

    public function getFootText()
    {
        return 'bloggs 尾';
    }
    public function getHeaderText()
    {
        return 'bloggs 头';
    }
}